package top.ljlgithub.api.shiro;

/**
 * @ClassName
 * @Description TODO
 * @Author L1470
 * @Date 2021/4/24 13:42
 * @Version 1.0
 **/

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.ljlgithub.api.jwt.JwtUtils;
//      用jwt凭证匹配器进行验证
public class JwtCredentialsMatcher implements CredentialsMatcher {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * JwtCredentialsMatcher只需验证JwtToken内容是否合法，在jwtRealm中过来的info（authenticationInfo），两者之间不需要验证
     * 一般的验证是：token是登录时的数据，info才是正确的数据，两者判断是否相同来允许登录，在jwt凭证匹配器中，只需要验证JwtToken内容是否合法
     */
    @Override
    public boolean doCredentialsMatch(AuthenticationToken authenticationToken, AuthenticationInfo authenticationInfo) {

//        获取传过来的jwtToken中的token字符串
        String token = authenticationToken.getCredentials().toString();
        try {
//            使用HS256算法和秘钥
            Algorithm algorithm = Algorithm.HMAC256(JwtUtils.SECRET);
//              获取验证对象
            JWTVerifier verifier = JWT.require(algorithm).build();
//            使用验证对象去验证token字符串
            verifier.verify(token);
//            如果是服务器的允许的token会返回true
            return true;
        } catch (JWTVerificationException e) {
            logger.error(e.getMessage());
        }
        return false;
    }

}
